package br.com.sipe.bean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.arquitetura.util.ConstantesARQ;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.arquitetura.util.Mascara;
import br.com.sipe.entidade.AreaAtuacao;
import br.com.sipe.entidade.Municipio;
import br.com.sipe.entidade.Participante;
import br.com.sipe.entidade.UF;
import br.com.sipe.entidade.Usuario;
import br.com.sipe.service.ParticipanteService;
import br.com.sipe.util.Constantes;
import br.com.sipe.util.CpfUtil;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;

@ManagedBean(name = "participanteBean")
@ViewScoped
public class ParticipanteBean extends PaginableBean<Participante> {

	private static final long serialVersionUID = 1L;

	private Integer idUf;
	private Integer idMunicipio;
	private List<SelectItem> ufs;
	private List<SelectItem> municipios;
	private AreaAtuacao areaAtuacao;

	@ManagedProperty(value = "#{login}")
	private LoginBean loginBean;

	@ManagedProperty(value = "#{ParticipanteService}")
	private ParticipanteService participanteService;

	private boolean exibirRelatorios;

	public ParticipanteBean() {
	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	public void carregarListas() {
		try {
			getModel().setFlgReceberInfo(true);
			ufs = ComboUtil.getItens(universalManager.listBy(new UF()));
			Collections.sort(ufs, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});
			municipios = new ArrayList<SelectItem>();

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@Override
	public String load() {
		try {
			super.load();
			idUf = getModel().getMunicipio().getUf().getId();
			changeUF(null);
			idMunicipio = getModel().getMunicipio().getId();
			areaAtuacao = getModel().getAreaAtuacao();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;
	}

	public void preProcessPDF(Object document) throws IOException, BadElementException, DocumentException {
		Document doc = (Document) document;
		doc.setPageSize(PageSize.A4.rotate());
	}

	@Override
	public String save() {
		try {

			if (areaAtuacao == null || areaAtuacao.getId() == 0) {
				FacesMessagesUtil.addErrorMessage("Área Atuação ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}
			if (getModel().getNome() == null || getModel().getNome().isEmpty()) {
				FacesMessagesUtil.addErrorMessage("Nome ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}
			if (getModel().getEmail() == null || getModel().getEmail().isEmpty()) {
				FacesMessagesUtil.addErrorMessage("Email ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}
			if (idUf == null || idUf == 0) {
				FacesMessagesUtil.addErrorMessage("UF ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}
			if (idMunicipio == null || idMunicipio == 0) {
				FacesMessagesUtil.addErrorMessage("Municipio ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}
			if (getModel().getFlgReceberInfo() == null) {
				FacesMessagesUtil.addErrorMessage("Receber Informação? ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}

			// Validar Email unique
			Participante participante = new Participante();
			participante.setEmail(getModel().getEmail().trim());
			List<Participante> lista = universalManager.listBy(participante, false);
			if (lista != null && !lista.isEmpty() && !lista.get(0).getId().equals(getModel().getId())) {
				FacesMessagesUtil.addErrorMessage("Email ", " Já cadastrado");
				return ERROR;
			}

			// se tiver cpf tirar a mascara e valida.
			if (getModel().getCpf() != null && !getModel().getCpf().isEmpty()) {
				String cpf = getModel().getCpf().trim().replaceAll("[()-.]", "");
				// Validar CPF
				if (!CpfUtil.isValidCPF(cpf)) {
					FacesMessagesUtil.addErrorMessage("CPF ", "Inválido");
					return ERROR;
				}
				getModel().setCpf(cpf);
			}
			if (getModel().getCep() != null && !getModel().getCep().trim().equals("")) {
				getModel().setCep(getModel().getCep().trim().replaceAll("[()-.]", ""));
			}
			getModel().setMunicipio(new Municipio(idMunicipio));
			getModel().setUsuario(new Usuario(loginBean.getModel().getId()));
			getModel().setAreaAtuacao(areaAtuacao);
			universalManager.save(getModel());
			setModel(new Participante());
			areaAtuacao = new AreaAtuacao();
			idMunicipio = 0;
			idUf = 0;
			FacesMessagesUtil.addInfoMessage(this.getQualifiedName(), this.getSaveMessage() + " " + ConstantesARQ.COM_SUCESSO);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;
	}

	public List<AreaAtuacao> completeArea(String query) {
		List<AreaAtuacao> sugestoes = new ArrayList<AreaAtuacao>();
		AreaAtuacao a = new AreaAtuacao();
		a.setDescricao(query);

		try {
			sugestoes = universalManager.listBy(a);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return sugestoes;

	}

	private void limparCampo() {
		idUf = null;
		idMunicipio = null;
	}

	@SuppressWarnings("unchecked")
	public void changeUF(AjaxBehaviorEvent evt) {
		try {
			Municipio municipio = new Municipio();
			municipio.setUf(new UF(idUf));
			municipios = ComboUtil.getItens(universalManager.listBy(municipio));
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@SuppressWarnings("unchecked")
	public LazyDataModel<Participante> getLazyDataModel() {
		try {
			if (lazyDataModel == null)
				lazyDataModel = new LazyDataModel() {

					private static final long serialVersionUID = 2595093445602418759L;

					@Override
					public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
						try {

							boolean sort = false;
							if (sortOrder.equals(SortOrder.DESCENDING)) {
								sort = true;
							}

							if (getFilters() != null && !getFilters().isEmpty()) {
								filters.putAll(getFilters());
							}

							// trata o filtro do cpf.
							if (filters != null) {
								Set<String> chaves = filters.keySet();
								for (String fil : chaves) {
									if (fil.trim().equalsIgnoreCase("cpf")) {
										filters.put("cpf", Mascara.retirarMascara((String) filters.get(fil)));
									}
								}
							}

							int rowCount = participanteService.countParticipante(getModel(), filters).intValue();
							lazyDataModel.setRowCount(rowCount);
							List<Participante> list = participanteService.paginateParticipante(first, pageSize, sortField, sort,
									getModel(), filters);
							if (list != null && !list.isEmpty()) {
								exibirRelatorios = true;
							} else {
								exibirRelatorios = false;
							}
							return list;
						} catch (Exception e) {
							ExcecaoUtil.tratarExcecao(e);
						}
						return null;
					}
				};

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return lazyDataModel;
	}

	@Override
	public void verificarAcesso() {
		// TODO Auto-generated method stub

	}

	@Override
	public Participante createModel() {
		return new Participante();
	}

	@Override
	public String getQualifiedName() {
		return "Participante";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		return null;
	}

	public Integer getIdUf() {
		return idUf;
	}

	public void setIdUf(Integer idUf) {
		this.idUf = idUf;
	}

	public Integer getIdMunicipio() {
		return idMunicipio;
	}

	public void setIdMunicipio(Integer idMunicipio) {
		this.idMunicipio = idMunicipio;
	}

	public List<SelectItem> getUfs() {
		return ufs;
	}

	public void setUfs(List<SelectItem> ufs) {
		this.ufs = ufs;
	}

	public List<SelectItem> getMunicipios() {
		return municipios;
	}

	public void setMunicipios(List<SelectItem> municipios) {
		this.municipios = municipios;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public AreaAtuacao getAreaAtuacao() {
		return areaAtuacao;
	}

	public void setAreaAtuacao(AreaAtuacao areaAtuacao) {
		this.areaAtuacao = areaAtuacao;
	}

	public LoginBean getLoginBean() {
		return loginBean;
	}

	public void setLoginBean(LoginBean loginBean) {
		this.loginBean = loginBean;
	}

	public ParticipanteService getParticipanteService() {
		return participanteService;
	}

	public void setParticipanteService(ParticipanteService participanteService) {
		this.participanteService = participanteService;
	}

	public boolean isExibirRelatorios() {
		return exibirRelatorios;
	}

	public void setExibirRelatorios(boolean exibirRelatorios) {
		this.exibirRelatorios = exibirRelatorios;
	}

}
